package com.itaming.lycheeframework.support.utils;

import org.springframework.util.Assert;
import org.springframework.util.LinkedCaseInsensitiveMap;

import java.util.Map;

/**
 * 快捷键值对类
 *
 * @author A.Ming
 */
public class Kv extends LinkedCaseInsensitiveMap<Object> {

    /**
     * 创建一个空的键值对
     *
     * @return Kv
     */
    public static Kv create() {
        return new Kv();
    }

    /**
     * 设置键值对
     *
     * @param key   键
     * @param value 值
     * @return this
     */
    public Kv set(String key, Object value) {
        Assert.notNull(key, "Key must not be null");
        super.put(key, value);
        return this;
    }

    /**
     * 设置键值对，如果值为<code>null</code>则忽略
     *
     * @param key   键
     * @param value 值
     * @return this
     */
    public Kv setIgnoreNull(String key, Object value) {
        Assert.notNull(key, "Key must not be null");
        if (value != null) {
            super.put(key, value);
        }
        return this;
    }

    /**
     * 设置指定键值对的全部元素，如果键为<code>null</code>则忽略
     *
     * @param map 键值对
     * @return this
     */
    public Kv setAll(Map<? extends String, ?> map) {
        if (map != null) {
            for (Entry<? extends String, ?> entry : map.entrySet()) {
                if (entry.getKey() == null) {
                    continue;
                }
                super.put(entry.getKey(), entry.getValue());
            }

        }
        return this;
    }

    /**
     * 设置指定键值对的全部元素，如果键或值为<code>null</code>则忽略
     *
     * @param map 键值对
     * @return this
     */
    public Kv setAllIgnoreNull(Map<? extends String, ?> map) {
        if (map != null) {
            for (Entry<? extends String, ?> entry : map.entrySet()) {
                if (entry.getKey() == null || entry.getValue() == null) {
                    continue;
                }
                super.put(entry.getKey(), entry.getValue());
            }
        }
        return this;
    }

    /**
     * 获取指定键的值，如果不存在返回<code>null</code>
     *
     * @param key 键
     * @return 值
     */
    @SuppressWarnings("unchecked")
    public <T> T get(String key) {
        return (T) super.get(key);
    }

    /**
     * 获取指定键的值，如果不存在返回默认值
     *
     * @param key          键
     * @param defaultValue 默认值
     * @return 值
     */
    @SuppressWarnings("unchecked")
    public <T> T get(String key, T defaultValue) {
        Object value = get(key);
        return value != null ? (T) value : defaultValue;
    }

    /**
     * 克隆
     *
     * @return Kv
     */
    @Override
    public Kv clone() {
        return (Kv) super.clone();
    }

}
